package com.augurit.wf.bi.service;

import java.util.List;
import java.util.Map;

import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
import org.springframework.transaction.annotation.Transactional;
import org.springside.modules.orm.Page;

import com.augurit.common.base.service.ICrudService;
import com.augurit.common.sysmeta.web.form.SysMetaTableForm;
import com.augurit.wf.bi.web.form.WfActElemPrivDefForm;
import com.augurit.wf.bi.web.form.WfBusInstanceTaskForm;
import com.augurit.wf.bi.web.form.WfBusTemplateForm;
import com.augurit.wf.bi.web.form.WfPageElementForm;
import com.augurit.wf.common.entity.WfPageElement;
import com.augurit.wf.common.service.IWfService;

public interface IWfBusTemplateService extends ICrudService<WfBusTemplateForm, Long> {
	
	public WfBusTemplateForm getByTemplateName(String templateName);
	
	/**
	 * 
	 * @param form
	 * @return
	 */
	public boolean saveAndShowRelatedEntitiesChanged(WfBusTemplateForm form);
	
	/**
	 * 更新模板，并导入权限
	 * @param wfService WfServiceImpl
	 * @param templateId 模板id
	 * @param curProcessDef 当前最新发布版本的流程定义
	 */
	public void updateVersionAndImportPriv(IWfService wfService, Long templateId, ProcessDefinitionImpl curProcessDef);
	
	/**
	 * 分页获取字段类型的页面元素（带权限控制信息）
	 * @param page
	 * @param form
	 * @return
	 */
	public Page<WfActElemPrivDefForm> getFieldElemWithPriv(Page<WfActElemPrivDefForm> page, WfActElemPrivDefForm form);
	
	public Page<WfActElemPrivDefForm> getContainElemWithPriv(Page<WfActElemPrivDefForm> page, WfActElemPrivDefForm form);
	public Page<WfActElemPrivDefForm> getButtonElemWithPriv(Page<WfActElemPrivDefForm> page, WfActElemPrivDefForm form);
	public Page<WfActElemPrivDefForm> getElemWithPrivByType(String elemType, Page<WfActElemPrivDefForm> page, WfActElemPrivDefForm form);
	public List<WfPageElement> getUnpublicElemsInTemplate(Long templateId);
	
	
	public WfBusTemplateForm getByTemplateCode(String templateCode);
	
	public WfBusTemplateForm getByWfDefKey(String wfDefKey);
	
	/**
	 * 根据模板类别获取流程业务模板列表
	 * @param templateType 模板类别
	 * @return 流程业务模板列表
	 */
	public List<WfBusTemplateForm> getByTemplateTypeId(Long templateTypeId);
	
	/**
	 * 删除指定模板类别的所有流程业务模板
	 * @param templateType
	 */
	public void deletByTemplateType(String templateType);
	
	/**
	 * 级联删除流程业务模板
	 * @param ids 模板主键ids
	 */
	public void deleteCascade(Long... ids);
	
	/**
	 * 分页获取指定流程业务模块下的页面元素
	 * @param page 分页对象
	 * @param templateId 模板id
	 * @return 
	 */
	public Page<WfPageElementForm> getPageElemByTemplateId(Page<WfPageElementForm> page, Long templateId);

	/**
	 * 获取模板中字段类型页面元素的elementId的列表
	 * @param templateId
	 * @return
	 */
	public List<String> getFieldTypeElementIdInTemplate(Long templateId);
	
	/**
	 * 分页获取不属于业务流程模板的公共页面元素
	 * @param templateId
	 * @param page
	 * @param form
	 * @return
	 */
	@Transactional(readOnly = true)
	public Page<WfPageElementForm> getPublicElementNotInTemplate(Long templateId, Page<WfPageElementForm> page, WfPageElementForm form);
	
	/**
	 * 分类获取业务流程模板下页面元素
	 * @param templateId 模板id
	 * @param elemType 元素类型
	 * @param isNeedGroupSort 是否需要组内排序
	 * @return
	 */
	public List<WfPageElementForm> getElementsByType(Long templateId, String elemType, boolean groupSort);
	
	public List<WfPageElementForm> getElementsByType(String templateCode, String elemType, boolean groupSort);
	
	/**
	 * 分页分类获取业务流程模板下页面元素
	 * @param page 分页对象
	 * @param templateId 模板id
	 * @param elemType元素类型
	 * @return
	 */
	public Page<WfPageElementForm> getPageElemInTemplateByType(Page<WfPageElementForm> page, Long templateId, String elemType);
	
	/**
	 * 分页获取页面元素在流程节点中的权限信息
	 * @param page 分页对象
	 * @param form 包含了templateId, version, viewName, activityName参数 
	 * @return
	 */
	public Page<WfActElemPrivDefForm> getPageElemWithPriv(Page<WfActElemPrivDefForm> page, WfActElemPrivDefForm form);
	
	
	/**
	 * 获取业务流程某一个流程节点下某一类流程节点的权限信息
	 * @param templateId
	 * @param version
	 * @param viewName
	 * @param activityName
	 * @return
	 */
	public List<WfActElemPrivDefForm> getElemPrivDef(Long templateId, Integer version, String viewName, String activityName);
	
	/**
	 * 删除模板中页面元素（注意：有两种情况：对于非公有页面元素，删除页面元素及关联；对于公有页面元素，删除模板与页面元素的关联） 
	 * @param tempalteId 模板id
	 * @param pageElementIds 页面元素
	 */
	public void deletePageElemFromTemplate(Long templateId, Long... pageElementIds);
	
	/**
	 * 根据权限控制信息获取某一个parentElementCode下的孩子元素
	 * @param parentElementCode 父元素Code
	 * @param instance 流程实例，包括模板、版本、视图、节点信息
	 * @return
	 */
	public List<WfPageElementForm> getChildElementsWithPriv(String parentElementCode, WfBusInstanceTaskForm instance);
	
	/**
	 * 获取业务流程某一个流程节点下某一类流程节点的权限信息
	 * @param elemType 元素类型
	 * @param instance 流程实例，包括模板、版本、视图、节点信息
	 * @param groupSort 是否需要组内排序
	 * @return
	 */
	public List<WfPageElementForm> getElementsWithPrivByType(String elemType, WfBusInstanceTaskForm instance, boolean groupSort);

	/**
	 * 导入字段到业务流程模板
	 * @param tempalteId 模板id
	 * @param filedsNeedToBeImported 需要导入的字段列表
	 * @param fieldsComments 字段对应的注释
	 */
	public void importFieldsToBusTemplate(Long templateId, List<String> filedsNeedToBeImported, Map<String, String> fieldsComments);
	
	/**
	 * 删除业务流程模板中已有的字段
	 * @param tempalteId 模板id
	 * @param fieldsNeededToBeDeleted 需要删除的字段列表
	 */
	public void deleteFieldsFromBusTemplate(Long templateId, List<String> fieldsNeededToBeDeleted);
	
	public List<WfBusTemplateForm> getAllActive();
	
	/**
	 * 获取打印模板
	 * @param templateCode
	 * @return
	 */
	public String getPrintTemplatePath(String templateCode);
	
	public List<SysMetaTableForm> getRelateEntities(Long templateId);
	public List<SysMetaTableForm> getSlaveEntities(Long templateId);
	
	public List<SysMetaTableForm> selectSlaveEntitiesByMasterEntity(SysMetaTableForm form, String masterEntity);
	
	/**
	 * 保存新增或修改的Form对象
	 */
	public void saveBySmartForm(WfBusTemplateForm form);
	
	/**
	 * 根据主键获取Form对象(主键不存在时候不报异常)
	 */
	public WfBusTemplateForm findById(Long id);
}